from django.shortcuts import render, HttpResponse


# Create your views here.
def reg(request):
    if request.method == 'POST':
        # 获取提交的数据
        user = request.POST.get('user')
        pwd = request.GET.get('pwd')

        # 对数据进行校验
        if len(user) < 6:
            # 校验不通过  返回错误提示
            user_error = '用户名长度不能少于6位'
            return render(request, 'reg.html', locals())

        # 校验通过，插入数据库
        else:
            return HttpResponse('校验通过')
    return render(request, 'reg.html')


# 定义form组件
from django import forms
from django.forms import models as form_model
from app01 import models

from django.core.exceptions import ValidationError  # 处理不符合校验规则需要导入的库
from django.core.validators import RegexValidator  # 很多内置校验器（该例子是正则表达式的校验器）


def check_name(value):
    # 不符合校验规则
    if 'alex' in value:
        raise ValidationError('alex的名字不符合社会主义价值观')

    # 符合校验不做任何操作


class RegForm(forms.Form):
    user = forms.CharField(
        label='用户名',
        min_length=6,
        required=False,
        # disabled=True,
        # validators=[check_name],  # 将校验器放入该位置，则回调用内容
        initial='alexdsb',
        error_messages={
            "required": "不能为空",
            "min_length": "用户名最短6位"
        }
    )  # 校验规则，长度不能小于6,初始值alexdsb
    pwd = forms.CharField(label='密码', widget=forms.PasswordInput)  # widget插件指定密码输入框（输入为密文）
    gender = forms.ChoiceField(choices=(('1', '男'), ('2', '女'), ('3', '不详')), widget=forms.RadioSelect)
    hobby = forms.MultipleChoiceField(choices=(('1', '抽烟'), ('2', '喝酒'), ('3', '画大饼')),
                                      widget=forms.CheckboxSelectMultiple)
    phone = forms.CharField(validators=[RegexValidator(r'^1[2-9\d9$]', '手机号格式不正确')])  # 前面引号放入匹配正则，后面引号放入匹配不成功的错误提示

    # hobby = form_model.ModelMultipleChoiceField(queryset=models.Hobby.objects.all(),
    #                                             widget=forms.CheckboxSelectMultiple)
    # hobby = form_model.ModelMultipleChoiceField(choices=models.Hobby.objects.values_list('id', 'name'),
    #                                             widget=forms.CheckboxSelectMultiple)  # 另一种写法

    # def __init__(self):
    #     super().__init__(*args, **kwargs)
    #     self.fields['hobby'].choices = models.Hobby.objects.values_list('id', 'name')  # 另一种写法需要的数据库赋值操作

    # 局部钩子
    def clean_user(self):  # user方法的校验
        # 不符合校验规则，抛出异常
        value = self.cleaned_data.get('user')
        # 不符合校验规则
        if 'alex' in value:
            raise ValidationError('alex的名字不符合社会主义价值观')

        # 符合校验规则  返回该字段的值
        return value

    # 全局钩子
    def clean(self):  # user方法的校验
        # 不符合校验规则，抛出异常
        value = self.cleaned_data.get('user')
        # 不符合校验规则
        if 'alex' in value:
            raise ValidationError('alex的名字不符合社会主义价值观')

        # 符合校验规则  返回该字段的值
        return value


def reg2(request):
    form_obj = RegForm()
    if request.method == 'POST':
        # 用form组件直接校验
        form_obj = RegForm(request.POST)
        if form_obj.is_valid():  # 对数据进行校验，拥有布尔返回值
            # 校验成功
            form_obj.cleaned_data  # 经过校验没有问题的数据（自己定义的钩子函数）
            return HttpResponse('注册成功')
    return render(request, 'reg2.html', {'form_obj': form_obj})
